其他
scrapy中Xpath表达式总结
xpath是一门在XML文档中查找指定信息的标记语言,可以对XML文档中的元素和属性使用路径表达式来进行定位(导航)。
xpath常用语法
/ 选择某个标签下的所有内容
text() 选择标签内所包含的文本
@ 选择标签属性信息
// 选择所有标签
[ ] 该标签属性满足一定条件
注意上面所有的操作,返回的结果都是HtmlResponse类,该类可以通过xpath()方法提取出信息。
response.xpath('/html/body/div/p').extract()
#['<p>This domain ... permission.</p>', '<p><a href="http://www.baidu.com>Baidu</a>"']
常见任务示例
下面我们作说明性示例。
选择所有的p元素
//p
找到div下面所有的链接(a元素)
//div//a
找到所有的a元素中的链接
//a/@href
找到a元素,该a元素的href值不含有abc
//a[not(contains(@href, 'abc))]
找到a元素,该a元素的href以
http://www.
开头
//a[starts-with(@href, 'http://www.')]
获取id为 "firstTtile" 的h1标签下的a中的text().
//h1[@href="firstTtile"]/a/text()
获取id为"dov"的div标签内的ul中a元素里的所有连接(href值)。
//div[@id="dov"]/ul//a/@href
获取class属性包含"rrr"以及class属性包含"yyy"的任意元素内所有h1中的文本。
//*[contains(@class, "rrr") and contains(@class, "yyy")]//h1//text()
选择元素包含"HelloPython"文本的元素之后的div元素中所有的链接(href值)
//*[text()="HelloPython"]/../following-sibing::div//a/@href
注意在scrapy中上面的所有的操作,返回的结果都是HtmlResponse类,该类可以通过xpath()方法提取出信息。例如
response.xpath('/html/body/div/p').extract()
#['<p>This domain ... permission.</p>', '<p><a href="http://www.baidu.com>Baidu</a>"']
考虑网页变化
Xpath表达式有时候会因为网站改版而失效,所以我们设计xpath时候应该多注意这方面事情,尽量降低这方面的设计问题。一些简单的的规则能降低这方面的风险:
避免使用索引值
//div/div/div[1]/div[2]/div[1]/div[1]/a/img
上面的xpath表达式不仅不稳健,而且难于阅读和理解。我们应该尽量使用接近img标签的表达式,借助id或者class属性,如
//div[@class="picture"]/a/img
class有时候不靠谱
由于css会用class来控制页面外观,所以网站会存在微小的布局调整,导致class属性值是变化的。例如下面的class
//div[@class="thumbnail"]/a/img
一段时间后,可能变成:
//div[@class="preview blue"]/a/img
id往往更可靠
一般来说,id属性是具有唯一标识的标签属性,不容易改动。所以用id表示的xpath表达式更稳健
//*[@id="more_detail"]//text()
精选文章